Ruby 日記 25日目: 演算子の評価順位
次のコードを実行するとどうなりますか
code:gold/ex25/main.rb
v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
puts v2 and false
選択肢:
シンタックスエラーとなる
実行時にエラーとなる
true と表示される
false と表示される
解説:
1 / 2 == 0はtrueなので、viはtrueである
!!v1はv1の二重否定なのでtrueである
v2 = true or raise RuntimeErrorはorより右が評価されないのでtrue
true and falseはfalse
だがしかし、andは評価する優先順位が低い演算子であるため、
puts true and falseは(puts true) and falseという扱いになる
よって正解は「true と表示される」
code:sh
# ruby gold/ex25/main.rb
true
/icons/hr.icon
今回の問題を、あえて括弧を使って評価順を明確にしてみる
code:gold/ex25/sample01.rb
v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
(puts v2) and false
code:sh
# ruby gold/ex25/sample01.rb
true
putsより左を括ってみる
code:gold/ex25/sample02.rb
v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
puts (v2 and false)
code:sh
# ruby gold/ex25/sample02.rb
false
andの代わりに&&を使う
code:gold/ex25/sample03.rb
v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
puts v2 && false
code:sh
# ruby gold/ex25/sample03.rb
false
今回の問題、こうだったらなんとなく間違いやすそうに感じる。変数v3を追加
code:gold/ex25/sample04.rb
v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
v3 = v2 and false
puts v3
code:sh
# ruby gold/ex25/sample04.rb
true
これも (v3 = v2) and falseという評価順序になっている、というだけの話、
/icons/hr.icon
プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形 式をとります。Rubyには以下にあげる演算子があります。
code:txt
高い ::
[]
+(単項) ! ~
**
-(単項)
* / %
+ -
<< >>
&
| ^
>= < <=
<=> == === != =~ !~
&&
||
.. ...
?:(条件演算子)
=(+=, -= ... )
not
低い and or
左の「高い」「低い」は演算子の優先順位です。
例えば「&&」は「||」より優先順位が高いので、以下のように 解釈されます
code:rb
a && b || c #=> (a && b) || c a || b && c #=> a || (b && c)